/**
 * Definition for singly-linked list.
 * */
function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val)
    this.next = (next === undefined ? null : next)
}

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function (head, n) {
    let currentNode = head
    let pre = head
    let i = 0

    while (currentNode) {
        if (i > n) {
            pre = pre.next
        }
        currentNode = currentNode.next
        i++
    }

    if (i === n) {
        return head.next
    }
    pre.next = pre.next.next
    return head
};

let inputNode = new ListNode(1, new ListNode(2, null))

removeNthFromEnd(inputNode, 2)

//================v3要点总结===============
/**
 * 1. 本版本采用双指针，间距n同时移动，当其中一个指针到达末尾时，另一个指针便是待删除的节点
 * 2. i 最后相当于len,当 len === n时，相当于直接去头，所以单独操作
 * 3， 其他情况，因为 1<=n ,所以pre.next必不可能为空，所以放心用
 */